#pragma once

#include <memory>
#include <map>
#include <algorithm>
#include "base/Bytes.h"
#include "protocol/routeinfo.pb.h"
#include "base/Logger.h"

using namespace routeinfo;

namespace zeroplus::mq
{
    class RouteInfoManager
    {
    private:
        std::map<std::string /* topic */, std::vector<routeinfo::QueueData>> topicQueueTable_;
        std::map<std::string /* brokerName */, routeinfo::BrokerData> brokerAddrTable_;
        std::map<std::string /* clusterName */, std::set<std::string /* brokerName */>> clusterAddrTable_;
        // std::map<std::string /* brokerAddr */, BrokerLiveInfo> brokerLiveTable_;

    public:
        RouteInfoManager();

        ~RouteInfoManager();

        std::string RegisterRouteInfo(
            std::string clusterName,
            std::string brokerAddr,
            std::string brokerName,
            uint32_t brokerId,
            std::map<std::string, routeinfo::TopicData> topicDataTable);

        std::string UnRegisterRouteInfo();

        routeinfo::TopicRouteInfo QueryRouteInfoByTopic(const std::string &topic);

        routeinfo::ClusterInfo GetAllClusterInfo();
    };
}

/*

在RocketMQ中，NameServer主要负责维护Broker的路由信息，处理来自Broker的注册、注销和心跳请求，以及来自客户端（Producer和Consumer）的路由查询请求。以下是NameServer如何处理这些请求的详细说明：

### 路由查询请求（Route Query Request）
1. **客户端请求**：Producer或Consumer向NameServer发送路由查询请求，通常是基于Topic的。
2. **处理请求**：NameServer查找内部的`RouteInfoManager`中的`topicQueueTable`，这个表存储了Topic与Broker队列的映射关系。
3. **返回响应**：NameServer将查询到的路由信息封装成响应返回给客户端。

### 路由注册请求（Route Register Request）
1. **Broker注册**：Broker启动时，会向NameServer发送注册请求，包含自己的信息和提供的Topic列表。
2. **更新路由信息**：NameServer的`RouteInfoManager`会更新`brokerAddrTable`和`topicQueueTable`，将Broker信息和Topic队列信息加入到相应的数据结构中。
3. **返回响应**：NameServer确认注册信息，并返回确认响应给Broker。

### 路由注销请求（Route Unregister Request）
1. **Broker注销**：Broker关闭或者发生故障时，会向NameServer发送注销请求。
2. **删除路由信息**：NameServer的`RouteInfoManager`会从`brokerAddrTable`和`topicQueueTable`中删除对应的Broker信息和Topic队列信息。
3. **返回响应**：NameServer确认注销信息，并返回确认响应给Broker。

### 心跳请求（Heartbeat Request）
1. **Broker心跳**：Broker定期向NameServer发送心跳，以表明自己的活跃状态。
2. **更新活跃信息**：NameServer的`BrokerHousekeepingService`会更新`brokerLiveTable`，记录Broker的最后心跳时间。
3. **处理不活跃Broker**：如果Broker在一定时间内没有发送心跳，NameServer会认为Broker不活跃，并从`brokerLiveTable`中移除该Broker信息。

### 是否使用队列缓存请求
NameServer处理请求时，通常不会使用队列来缓存请求。NameServer的请求处理是直接的，请求通常被立即处理并返回响应。以下是一些特殊情况：

- **批量注销服务**：`BatchUnregistrationService`可能会使用队列来批量处理注销请求，以优化性能和减少对NameServer的压力。
- **异步处理**：某些情况下，NameServer可能会使用异步处理机制来处理请求，例如，异步更新配置信息。

总的来说，NameServer的设计目标是提供快速的路由查询服务，因此，它通常不会在内存中缓存请求。相反，它会直接处理请求，并利用内存中的数据结构（如HashMap）来快速响应客户端的查询。

*/